package cn.tedu.ds;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/*
spring容器类---------《模拟SpringIoC的实现》
 */
public class SpringContext2 {
    public static void main(String[] args) throws Exception {
        SpringContext2 sc = new SpringContext2();
        //使用getBean()方法 ,根据类名，获取类的对象
        //右侧返回的是Object父类，左侧要子类--需要强转--向下转型--是为了使用子类的功能
        Hao hao = (Hao) sc.getBean("hao");//类名即key必须首字母小写（全小写最好）
        System.out.println(hao);
        hao.load();
    }


    //1.1、创建集合作为【Bean容器】存放管理Bean
  private  List<Bean2>  beans =  new ArrayList<>(); //<Bean类> + beans为容器对象
    //1.2创建无参构造；
    public SpringContext2() throws Exception {
        //创建Bean对象，设置属性参数
        Bean2 b = new Bean2("hao","cn.tedu.ds.Hao");//类名必须小写
        //add（）方法存放list集合
        beans.add(b);
        init();//初始化容器
    }
    //2.1、创建Map集合作为【Spring容器】 泛型为String类型的name和Object对象 ；并初始化容器
     private  final   Map<String,Object>   map =    new HashMap<>();
    //2.2、通过初始化方法进行遍历
    public void init() throws Exception {
       //foreach遍历Bean容器
        for (Bean2 be: beans
             ) {
            //遍历后再获取map集合的key和value；即类名和全路径
            String key = be.getName();
            String path = be.getPath();
            //反射创建对象，put方法存入map集合
            Object value = Class.forName(path).newInstance();
            map.put(key,value);

        }

    }
    //3.getBean方法来传入参数；【通过类名获取map集合的Bean对象，并返回】
    public  Object  getBean(String s){
        return map.get(s);
    }

}
